package com.huayue.controller;

import java.util.Map;

import org.springframework.web.servlet.ModelAndView;

import com.alibaba.fastjson.support.spring.FastJsonJsonView;
import com.huayue.service.BaseService;
import com.huayue.util.PageHelper;

/**
 * Controller层模板 code：layui接收的唯一验证； status：用于业务判断 ；msg：向页面发送信息； icon：页面图标；
 * 
 */
public class BaseController {
    /**
     * 添加模板
     * 
     * @param svc
     *            传入继承BaseService的类
     * @param entity
     *            传入实体类
     * @param <T>
     * @return
     */
    public <T> ModelAndView add(BaseService svc, T entity) {
        // 创建一个用于格式化json数据的对象，方便向前台发送json数据
        FastJsonJsonView view = new FastJsonJsonView();
        // 进行持久层操作
        int status = svc.insert(entity);
        // 向view对象中添加数据
        view.addStaticAttribute("code", 0);
        if (status > 0) {
            view.addStaticAttribute("status", status);
            view.addStaticAttribute("icon", 1);
            view.addStaticAttribute("msg", "添加成功");
        } else {
            view.addStaticAttribute("status", status);
            view.addStaticAttribute("icon", 2);
            view.addStaticAttribute("msg", "添加失败");
        }
        // 返回json数据
        return new ModelAndView(view);
    }

    /**
     * 修改模板
     * 
     * @param svc
     * @param entity
     * @param <T>
     * @return
     */
    public <T> ModelAndView update(BaseService svc, T entity) {
        // 创建一个用于格式化json数据的对象，方便向前台发送json数据
        FastJsonJsonView view = new FastJsonJsonView();
        // 进行持久层操作
        int status = svc.update(entity);
        // 向view对象中添加数据
        view.addStaticAttribute("code", 0);
        if (status > 0) {
            view.addStaticAttribute("status", status);
            view.addStaticAttribute("icon", 1);
            view.addStaticAttribute("msg", "修改成功");
        } else {
            view.addStaticAttribute("status", status);
            view.addStaticAttribute("icon", 2);
            view.addStaticAttribute("msg", "修改失败");
        }
        // 返回json数据
        return new ModelAndView(view);
    }

    /**
     * 删除模板
     * 
     * @param svc
     * @param entity
     * @param <T>
     * @return
     */
    public <T> ModelAndView delete(BaseService svc, T entity) {
        // 创建一个用于格式化json数据的对象，方便向前台发送json数据
        FastJsonJsonView view = new FastJsonJsonView();
        // 进行持久层操作
        int status = svc.delete(entity);
        // 向view对象中添加数据
        view.addStaticAttribute("code", 0);
        if (status > 0) {
            view.addStaticAttribute("status", status);
            view.addStaticAttribute("icon", 1);
            view.addStaticAttribute("msg", "删除成功");
        } else {
            view.addStaticAttribute("status", status);
            view.addStaticAttribute("icon", 2);
            view.addStaticAttribute("msg", "删除失败");
        }
        // 返回json数据
        return new ModelAndView(view);
    }

    /**
     * 查询一条数据
     * 
     * @param svc
     * @param entity
     * @param <T>
     * @return
     */
    public <T> ModelAndView findOne(BaseService svc, T entity) {
        // 去查询
        Map<String, Object> map = svc.findOne(entity);
        // 创建一个用于格式化json数据的对象，方便向前台发送json数据
        FastJsonJsonView view = new FastJsonJsonView();
        // 向view对象中添加数据
        view.addStaticAttribute("code", 0);
        view.addStaticAttribute("status", 1);
        view.addStaticAttribute("data", map);
        // 返回json数据
        return new ModelAndView(view);
    }

    /**
     * 分页查询方法
     * 
     * @param svc
     * @param page
     * @param entity
     * @param objects
     * @param <T>
     * @return
     */
    public <T> ModelAndView findPage(BaseService svc, PageHelper page, T entity, Object... objects) {
        // 创建一个用于格式化json数据的对象，方便向前台发送json数据
        FastJsonJsonView view = new FastJsonJsonView();
        // 创建pageHelper对象，用于分页
        PageHelper pages = new PageHelper();
        // 从数据库查询总数
        pages.setCount(svc.count(objects));
        // 设置当前页
        pages.setPageNow(page.getPageNow() == 0 ? 1 : Integer.valueOf(page.getPageNow()));
        // 设置页大小
        pages.setPageSize(page.getPageSize() == 0 ? 5 : Integer.valueOf(page.getPageSize()));
        // 向view对象中添加数据
        view.addStaticAttribute("code", 0);
        view.addStaticAttribute("message", "查询成功");
        view.addStaticAttribute("count", pages.getCount());
        // -----------------------------------从数据查询数据信息
        view.addStaticAttribute("data", svc.findPage(pages, objects));
        // 返回json数据
        return new ModelAndView(view);
    }
}
